use bytes::Bytes;
// use tools::utils::{get_bits_bool, BitsField};

use crate::Codec;

// const E: BitsField = BitsField {
// 	position: 7,
// 	mark: 0b1,
// };

//保留位 ,暂时存在这里的.
// const R: BitsField = BitsField {
// 	position: 6,
// 	mark: 0b1,
// };

// const VOL: BitsField = BitsField {
// 	position: 0,
// 	mark: 0b111111,
// };

///处理rfc2833标准,获取和生成rfc2833的包.
pub(crate) struct Rfc2833 {
	pub(crate) dtmf: char,
	// is_end: bool,
	inner: Bytes,
}

impl Codec for Rfc2833 {
	fn write_to(&self, buf: &mut bytes::BytesMut) {
		buf.extend_from_slice(&self.inner);
	}

	fn from_bytes(buf: &mut Bytes) -> tools::ResultEx<Self>
	where
		Self: Sized,
	{
		Ok(Self {
			inner: buf.clone(),
			dtmf: get_dtmf(buf[0]),
			// is_end: get_is_end(buf[1]),
		})
	}
}

// impl Rfc2833 {
// 	///直接判断一个byte里面的事件是否结束....
// 	/// 要求此包一定是一个rfc2833包.并且是一个完整的rtp包.
// 	pub(crate) fn packet_is_end(buf :&[u8]) -> bool{
// 		//前面有12个rtp的包头.然后跳过按键值.
// 		get_is_end(buf[13])
// 	}

// 	pub(crate) fn new(dtmf: char, is_end: bool, du: u16) -> Self {
// 		let mut buf = BytesMut::with_capacity(4);
// 		buf.put_u8(set_dtmf(dtmf));
// 		if is_end {
// 			buf.put_u8(0x8a);
// 		} else {
// 			buf.put_u8(0x0a);
// 		}

// 		buf.put_u16(du);

// 		Self {
// 			inner: buf.freeze(),
// 			dtmf,
// 			// is_end,
// 		}
// 	}
// }

// fn get_is_end(buf: u8) -> bool {
// 	get_bits_bool(buf, &E)
// }

fn get_dtmf(b: u8) -> char {
	match b {
		0..=9 => (b + 0x30) as char,
		10 => '*',
		11 => '#',
		12 => 'A',
		13 => 'B',
		14 => 'C',
		15 => 'D',
		16 => 'F',
		_ => ' ',
	}
}

// fn set_dtmf(ch: char) -> u8 {
// 	match ch {
// 		'0'..='9' => ch as u8 - 0x30,
// 		'*' => 10,
// 		'#' => 11,
// 		'A' => 12,
// 		'B' => 13,
// 		'C' => 14,
// 		'D' => 15,
// 		'F' => 16,
// 		_ => 0xff,
// 	}
// }
